
#include <stdlib.h>
#include <ncurses.h>

#include "snake/draw.h"
#include "snake/global.h"

/**
 * @description: 绘制方块
 * @param {int} r 行
 * @param {int} c 列
 * @return {*}
 */
static void DrawBlock(int r,int c)  
{
    attron(A_REVERSE); // 设置属性：反色
    // mvaddch 行 列 字符 
    // printf("%d\n",CTC(c));
    // printf("%d\n",CTR(r));
    // mvaddstr(CTR(r),CTC(c),"  ");
    mvaddch(CTR(r),CTC(c),' ');
    mvaddch(CTR(r),CTC(c)+1,' ');
    attroff(A_REVERSE); // 关闭反色
}

/**
 * @description: 绘制游戏地图围墙
 * @param {int} ofs_r 行偏移
 * @param {int} ofs_c 列偏移
 * @param {int} height 高
 * @param {int} width 宽
 * @return {*}
 */
static void DrawMap(int ofs_r,int ofs_c,int height,int width)
{
    // 画行 从上往下
    for(int r = ofs_r;r < ofs_r + height + 1;r++)
    {
        DrawBlock(r,ofs_c - 1);
        DrawBlock(r,ofs_c + width);
    }
    // 画行 从左往右
    for(int c = ofs_c - 1;c < ofs_c + width + 1;c++)
    {
        DrawBlock(ofs_r - 1,c);
        DrawBlock(ofs_r + height ,c);
    }
}

// 画一些字符
static void DrawString()
{
    // 分数
    attron(A_REVERSE); // 设置属性：反色
    mvaddstr(GTRR(1),GTRC(MAP_WIDTH + 4),"score");
    attroff(A_REVERSE); // 关闭反色
    
    
}

// 画蛇
static void DrawSnake()
{
    mvaddch(GTRR(mysnake.body_node[0].r),GTRC(mysnake.body_node[0].c),'#');
    for(unsigned int i = 1;i < mysnake.body_length;i++)
    {
        mvaddch(GTRR(mysnake.body_node[i].r),GTRC(mysnake.body_node[i].c),'*');
    }
    
}

//
void DrawClearNode(int r,int c)
{
    mvaddch(GTRR(r),GTRC(c),' ');
}

// 画食物
static void DrawFood()
{
    if(food.is_draw == 0)
    {
        mvaddch(GTRR(food.r),GTRC(food.c),'+');
    }
}

// 画分数
static void DrawScore()
{
    mvprintw(GTRR(3),GTRC(MAP_WIDTH + 4),"%d",mysnake.body_length-3);
}



/**
 * @description: 绘制初始化
 * @return {*}
 */
void DrawInit(void)
{
    initscr();  // 初始化窗口对象和 ncurses 代码，返回代表整个屏幕的窗口对象
    cbreak();  // 禁用缓冲并使键入的输入立即可用
    noecho(); // 关闭回显，因此用户输入不会显示在屏幕上
    curs_set(0); // 隐藏光标

}

/**
 * @description: 绘制结束
 * @return {*}
 */
void DrawEnd(void)
{
    endwin(); // 结束ncurses,重置终端
}

/**
 * @description: 清屏
 * @return {*}
 */
void DrawClear(void)
{
    clear(); // 清除显示内容
    refresh(); // 刷新屏幕
}


/**
 * @description: 绘制游戏开始界面
 * @return {*}
 */
void DrawGameStart(void)
{
    DrawClear();
    mvaddstr(CTR(10),CTC(10),"game:snake");
    refresh(); // 刷新屏幕
}


/**
 * @description: 绘制游戏地图静态资源
 * @return {*}
 */
void DrawGameMapInit(void)
{
    DrawClear();
    DrawMap(MAP_OFFSET_ROW,MAP_OFFSET_COL,MAP_HEIGHT,MAP_WIDTH); // 绘制围墙
    DrawString();
    refresh(); // 刷新屏幕
}

/**
 * @description: 刷新地图画面
 * @return {*}
 */
void DrawRefreshGameMap(void)
{
    
    DrawSnake(); // 画蛇
    DrawFood(); // 画食物
    DrawScore(); // 画分数
    refresh(); // 刷新屏幕

}


void DrawGameEnd(void)
{
    DrawClear();
    mvaddstr(CTR(10),CTC(10),"game over");
    refresh(); // 刷新屏幕
}
